<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
    <title>Reference</title>
    <link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>

<div id="container">

<div id="product">
	<div id="product_logo"></div>
	<div id="product_name"><big><b></b></big></div>
	<div id="product_description"></div>
</div> <!-- id="product" -->


<div id="main">


<!-- Menu -->

<div id="navigation">
<br/>
<h1>Duplex</h1>

<ul>
  <li><a href="../index.html">Index</a></li>
</ul>

<h2>Contents</h2>
<ul>
<li><a href="#Functions">Functions</a></li>
<li><a href="#Fields">Fields</a></li>
</ul>


<h2>Modules</h2>
<ul class="$(kind=='Topics' and '' or 'nowrap'">
  <li><a href="../modules/Duplex.Application.html">Duplex.Application</a></li>
  <li><a href="../modules/Duplex.Applications.Effect.html">Duplex.Applications.Effect</a></li>
  <li><strong>Duplex.Applications.GridPie</strong></li>
  <li><a href="../modules/Duplex.Applications.Hydra.html">Duplex.Applications.Hydra</a></li>
  <li><a href="../modules/Duplex.Applications.Instrument.html">Duplex.Applications.Instrument</a></li>
  <li><a href="../modules/Duplex.Applications.Keyboard.GridLayout.html">Duplex.Applications.Keyboard.GridLayout</a></li>
  <li><a href="../modules/Duplex.Applications.Keyboard.Layouts.HarmonicLayout.html">Duplex.Applications.Keyboard.Layouts.HarmonicLayout</a></li>
  <li><a href="../modules/Duplex.Applications.Keyboard.Layouts.IsomorphicLayout.html">Duplex.Applications.Keyboard.Layouts.IsomorphicLayout</a></li>
  <li><a href="../modules/Duplex.Applications.Keyboard.Layouts.PianoLayout.html">Duplex.Applications.Keyboard.Layouts.PianoLayout</a></li>
  <li><a href="../modules/Duplex.Applications.Keyboard.html">Duplex.Applications.Keyboard</a></li>
  <li><a href="../modules/Duplex.Applications.Matrix.html">Duplex.Applications.Matrix</a></li>
  <li><a href="../modules/Duplex.Applications.Metronome.html">Duplex.Applications.Metronome</a></li>
  <li><a href="../modules/Duplex.Applications.MidiActions.Bindings.html">Duplex.Applications.MidiActions.Bindings</a></li>
  <li><a href="../modules/Duplex.Applications.MidiActions.html">Duplex.Applications.MidiActions</a></li>
  <li><a href="../modules/Duplex.Applications.Mixer.html">Duplex.Applications.Mixer</a></li>
  <li><a href="../modules/Duplex.Applications.Mlrx.Mlrx_group.html">Duplex.Applications.Mlrx.Mlrx_group</a></li>
  <li><a href="../modules/Duplex.Applications.Mlrx.Mlrx_note.html">Duplex.Applications.Mlrx.Mlrx_note</a></li>
  <li><a href="../modules/Duplex.Applications.Mlrx.Mlrx_pos.html">Duplex.Applications.Mlrx.Mlrx_pos</a></li>
  <li><a href="../modules/Duplex.Applications.Mlrx.Mlrx_track.html">Duplex.Applications.Mlrx.Mlrx_track</a></li>
  <li><a href="../modules/Duplex.Applications.Mlrx.html">Duplex.Applications.Mlrx</a></li>
  <li><a href="../modules/Duplex.Applications.Navigator.html">Duplex.Applications.Navigator</a></li>
  <li><a href="../modules/Duplex.Applications.NotesOnWheels.html">Duplex.Applications.NotesOnWheels</a></li>
  <li><a href="../modules/Duplex.Applications.PatternCursor.html">Duplex.Applications.PatternCursor</a></li>
  <li><a href="../modules/Duplex.Applications.PatternSequence.html">Duplex.Applications.PatternSequence</a></li>
  <li><a href="../modules/Duplex.Applications.Recorder.html">Duplex.Applications.Recorder</a></li>
  <li><a href="../modules/Duplex.Applications.Repeater.html">Duplex.Applications.Repeater</a></li>
  <li><a href="../modules/Duplex.Applications.Rotate.html">Duplex.Applications.Rotate</a></li>
  <li><a href="../modules/Duplex.Applications.StepSequencer.html">Duplex.Applications.StepSequencer</a></li>
  <li><a href="../modules/Duplex.Applications.SwitchConfiguration.html">Duplex.Applications.SwitchConfiguration</a></li>
  <li><a href="../modules/Duplex.Applications.TestPad.html">Duplex.Applications.TestPad</a></li>
  <li><a href="../modules/Duplex.Applications.TrackSelector.html">Duplex.Applications.TrackSelector</a></li>
  <li><a href="../modules/Duplex.Applications.Transport.html">Duplex.Applications.Transport</a></li>
  <li><a href="../modules/Duplex.Applications.UIButtonTest.html">Duplex.Applications.UIButtonTest</a></li>
  <li><a href="../modules/Duplex.Applications.XYPad.html">Duplex.Applications.XYPad</a></li>
  <li><a href="../modules/Duplex.Automation.html">Duplex.Automation</a></li>
  <li><a href="../modules/Duplex.Browser.html">Duplex.Browser</a></li>
  <li><a href="../modules/Duplex.BrowserProcess.html">Duplex.BrowserProcess</a></li>
  <li><a href="../modules/Duplex.Canvas.html">Duplex.Canvas</a></li>
  <li><a href="../modules/Duplex.CanvasPoint.html">Duplex.CanvasPoint</a></li>
  <li><a href="../modules/Duplex.ControlMap.html">Duplex.ControlMap</a></li>
  <li><a href="../modules/Duplex.Device.html">Duplex.Device</a></li>
  <li><a href="../modules/Duplex.Display.html">Duplex.Display</a></li>
  <li><a href="../modules/Duplex.Globals.html">Duplex.Globals</a></li>
  <li><a href="../modules/Duplex.Message.html">Duplex.Message</a></li>
  <li><a href="../modules/Duplex.MessageStream.html">Duplex.MessageStream</a></li>
  <li><a href="../modules/Duplex.MidiDevice.html">Duplex.MidiDevice</a></li>
  <li><a href="../modules/Duplex.OscClient.html">Duplex.OscClient</a></li>
  <li><a href="../modules/Duplex.OscDevice.html">Duplex.OscDevice</a></li>
  <li><a href="../modules/Duplex.OscVoiceMgr.html">Duplex.OscVoiceMgr</a></li>
  <li><a href="../modules/Duplex.Preferences.html">Duplex.Preferences</a></li>
  <li><a href="../modules/Duplex.ProcessSlicer.html">Duplex.ProcessSlicer</a></li>
  <li><a href="../modules/Duplex.RoamingDSP.html">Duplex.RoamingDSP</a></li>
  <li><a href="../modules/Duplex.Scheduler.html">Duplex.Scheduler</a></li>
  <li><a href="../modules/Duplex.StateController.html">Duplex.StateController</a></li>
  <li><a href="../modules/Duplex.UIButton.html">Duplex.UIButton</a></li>
  <li><a href="../modules/Duplex.UIButtonStrip.html">Duplex.UIButtonStrip</a></li>
  <li><a href="../modules/Duplex.UIComponent.html">Duplex.UIComponent</a></li>
  <li><a href="../modules/Duplex.UIKey.html">Duplex.UIKey</a></li>
  <li><a href="../modules/Duplex.UIKeyPressure.html">Duplex.UIKeyPressure</a></li>
  <li><a href="../modules/Duplex.UILabel.html">Duplex.UILabel</a></li>
  <li><a href="../modules/Duplex.UIPad.html">Duplex.UIPad</a></li>
  <li><a href="../modules/Duplex.UIPitchBend.html">Duplex.UIPitchBend</a></li>
  <li><a href="../modules/Duplex.UISlider.html">Duplex.UISlider</a></li>
  <li><a href="../modules/Duplex.UISpinner.html">Duplex.UISpinner</a></li>
  <li><a href="../modules/Duplex.WidgetHooks.html">Duplex.WidgetHooks</a></li>
  <li><a href="../modules/Duplex.WidgetKeyboard.html">Duplex.WidgetKeyboard</a></li>
  <li><a href="../modules/Duplex.html">Duplex</a></li>
  <li><a href="../modules/main.html">main</a></li>
</ul>

</div>

<div id="content">

<h1>Module <code>Duplex.Applications.GridPie</code></h1>
<p>Grid Pie lets you combine different parts of song, non-linearly, in real time.</p>
<p>

<p>Inheritance: <a href="../modules/Duplex.Application.html#">Duplex.Application</a> > Duplex.Application.GridPie </p>

<h3>Discussion</h3>

<p>Tool discussion is located on the <a href="http://forum.renoise.com/index.php?/topic/33484-new-tool-28-duplex-grid-pie/">Renoise forum</a></p>


<h3>Changes</h3>

<p>  0.98.32 </p>
<pre><code>- FEATURE Support for blinking LEDs on monochrome devices
</code></pre>

<p>  0.98.29 </p>
<pre><code>- FIXME Ignore pattern switching, when arriving in the last line of pattern
 (this avoids that using the Navigator will cause the pattern to switch)
</code></pre>

<p>  0.99.23</p>
<pre><code>- FIXME (Recording) better handling of patt. cloning near boundaries
- TWEAK “Keep the beat” changed to modify playback-pos less often
- FIXME Sess-rec.: “Stuttering” after short pattern (incremental_update)
- FIXME Assign to slot: use patt-idx, not seq-idx (doh!)
- FIXME Do not block “trigger gestures” in separate tracks
- FEATURE Record: when triggering a pattern, use incremental updates
- FEATURE Shorten pattern instead of modifying playback-pos (when possible)
- FEATURE skip group tracks when temp-muting
- FEATURE When muting track, delay note-off (to keep existing instr.)
- FIXME Incremental updates should use the master slot range only
- FIXME Don’t signal “dun goofed” when not started
- USABILITY Restore matrix state when GP pattern is “dun goofed”
</code></pre>

<p>  0.99.22</p>
<pre><code>- Overview of new features:
 - Realtime recording (including session recording)
 - Multitouch gestures (assign/resolve aliases, save combination, etc.)
 - Visualization of aliased slots, current track + pattern etc.
 - Configurable initialization and shutdown process (options)
 - Many smaller bug fixes, cleaner code ...
- Feature: assign an alias by pressing and holding a slot button (source), and
  then pressing another button in the same track. The procedure will only
  work when the source slot is already aliased or empty (to avoid accidents)
- Feature: to complement the assignment gesture just mentioned, you can hold
  the button pressed to “force-assign” slots that are empty, or unique
- Feature: resolve any aliased slots in the gridpie pattern to it’s master slot
  by pressing a slot in the gridpie pattern (the last pattern). Conceptually
  similar to the pattern-editor (arrow in the lower part of an aliased track)
- Feature: quickly store “homeless” content (a track in the gridpie pattern with
  no master slot), either by creating a new pattern to hold the data or by
  assigning the content to an existing slot
- Feature: hold a gridpie button to save the combination as a new pattern
- Feature: make an alias unique (un-alias) by holding it, then it’s gridpie slot
- Tweak: highlight the selected alias master slot (if any exists)
- Tweak: better visualization of the current track/sequence position
- New option: “highlight”, toggles track/sequence highlighting on/off
- New option: auto-start has been expanded into “initialization”
- New option: “shutdown”, use it to control the shutdown procedure
- Fixed: de-activating a group track will not send the brief mute (avoid click)
- Fixed: properly update mute state when gridpie is cloned
- Fixed: line notifiers could get lost when scrolling through the song
- Fixed: UI integration with Renoise pattern-matrix is gone (buggy)
- Restructured code, simplified things...
</code></pre>

<p>  0.99.21</p>
<pre><code>- Fixed: retain mute state when toggling a pattern off (hold x2)
- Fixed: track navigation could show wrong track on startup
- Feature: turbocharged mode (using a pattern cache along with aliased slots)
- Feature/workflow: (even) closer integration into Renoise
  + detect changes to mute states in the Renoise matrix (mouse+alt-click)
  + detect when a pattern has been scheduled in Renoise
  + disable pattern loop to allow song to play, pattern-by-pattern (1)
- Feature/workflow: ability to clone gridpie pattern while playing

(1) This, and pattern scheduling via Renoise can be considered experimental as
we can’t reliably detect a scheduled pattern. As a result, the first few
note(s) might be skipped!
</code></pre>

<p>  0.99.20</p>
<pre><code>- Edit-sync: automatic background-synchronization of pattern data
- Edit-sync: detect changes to the pattern length (source tracks)
- Update grid display as content is created or removed in the matrix
- Visualize the currently selected pattern (when the controller is able to)
- Attempt to maintain pattern matrix slot mute states at all times (1)
- Ability to clone the __GRID PIE__ pattern without stopping the application
- New option: Beat-measures (related to the improved ‘keep the beat’ feature)
- Fixed: removed display-glitch in the virtual UI (on startup)
- Fixed: remove all notifiers when app is stopped

(1) GridPie will attempt to retain as much information about the mute state of
the song as possible, as this is restored when we exit GridPie. Note however
that using drag-and-drop within the pattern sequence will cause the mute state
to become lost for the rearranged patterns. Simple insert/clone and delete
actions should not cause this to happen.
</code></pre>

<p>  0.98.18</p>
<pre><code>- Disable of “follow_player” now only enforced outside the grid-pie pattern
</code></pre>


<p>  0.98.17</p>
<pre><code>- fixed a bug in the “running start” feature (when switching away from Grid
  without having run the application)
</code></pre>

<p>  0.98.16</p>
<pre><code>- Features: “Keep the beat” and “running start”
</code></pre>

<p>  0.98 </p>
<pre><code>- First release
</code></pre>



</p>


<h2><a href="#Functions">Functions</a></h2>
<table class="function_list">
	<tr>
	<td class="name" nowrap><a href="#__init">__init (VarArg)</a></td>
	<td class="summary">Constructor method</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_add_pending_update">_add_pending_update (src_patt_idx, pos)</a></td>
	<td class="summary">Method for adding pending updates, called whenever a pattern which is being
 monitored has changed and a track requires a copy-expansion.</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_apply_pending_updates">_apply_pending_updates ()</a></td>
	<td class="summary">copy/expand tracks once the scheduled updates have timed out</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#adapt_gridpie_pattern">adapt_gridpie_pattern ()</a></td>
	<td class="summary">prepare a newly cloned Grid Pie pattern before playback reaches it</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#is_session_recording">is_session_recording ()</a></td>
	<td class="summary">helper method to determine if we are currently recording a session</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#clear_lines">clear_lines (track_idx, patt_idx, start_line, end_line)</a></td>
	<td class="summary">clear lines using iterator</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#alias_slot">alias_slot (track_idx, alias_p_idx)</a></td>
	<td class="summary">set one of the recombination pattern-tracks as aliased</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#set_pattern_cache">set_pattern_cache (patt_idx, track_idx, num_lines)</a></td>
	<td class="summary">update the internal pattern cache, called immediately after copy-expand</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#get_pattern_cache">get_pattern_cache (patt_idx, track_idx)</a></td>
	<td class="summary">retrieve value from internal pattern cache</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_set_page_sizes">_set_page_sizes ()</a></td>
	<td class="summary">apply the current settings to page<em>size</em>v and page<em>size</em>h variables</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_get_v_limit">_get_v_limit ()</a></td>
	<td class="summary">figure out the upper boundary</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_get_h_limit">_get_h_limit ()</a></td>
	<td class="summary">Figure out the lower boundary</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#set_vertical_pos">set_vertical_pos (idx)</a></td>
	<td class="summary">set the vertical position of the grid</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#set_horizontal_pos">set_horizontal_pos (idx)</a></td>
	<td class="summary">set the horizontal position of the grid</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#set_vertical_pos_page">set_vertical_pos_page (seq_idx)</a></td>
	<td class="summary">set a pattern sequence index, quantized to page size</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#update_h_buttons">update_h_buttons ()</a></td>
	<td class="summary">update buttons for horizontal navigation</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#update_v_buttons">update_v_buttons ()</a></td>
	<td class="summary">update buttons for vertical navigation</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#update_v_slider">update_v_slider ()</a></td>
	<td class="summary">update slider for vertical navigation</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#update_h_slider">update_h_slider ()</a></td>
	<td class="summary">update slider for horizontal navigation</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#goto_prev_track_page">goto_prev_track_page ()</a></td>
	<td class="summary">go to previous track-page</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#goto_next_track_page">goto_next_track_page ()</a></td>
	<td class="summary">go to next track-page</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#goto_first_track_page">goto_first_track_page ()</a></td>
	<td class="summary">go to first track-page</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#goto_last_track_page">goto_last_track_page ()</a></td>
	<td class="summary">go to last track-page</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#goto_next_seq_page">goto_next_seq_page ()</a></td>
	<td class="summary">go to next sequence-page</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#goto_prev_seq_page">goto_prev_seq_page ()</a></td>
	<td class="summary">go to previous sequence-page</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#goto_first_seq_page">goto_first_seq_page ()</a></td>
	<td class="summary">go to first sequence-page</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#goto_last_seq_page">goto_last_seq_page ()</a></td>
	<td class="summary">go to last sequence-page</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#can_mute_pattern">can_mute_pattern (seq_idx)</a></td>
	<td class="summary">check if a hold event should perform a "pattern toggle"
 this is only possible when every track is active &amp; aligned</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_slots_are_aligned">_slots_are_aligned (seq_idx)</a></td>
	<td class="summary">function to check if all slots are aligned to the same sequence index</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#is_garbage_pos">is_garbage_pos (track_idx, seq_idx)</a></td>
	<td class="summary">is garbage PM position?</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#matrix_cell">matrix_cell (x, y)</a></td>
	<td class="summary">access a cell in the Grid Pie</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#init_pm_slots_to">init_pm_slots_to (val)</a></td>
	<td class="summary">toggle all slot mutes in Pattern Matrix
 (called when starting and stopping the application)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#init_gp_pattern">init_gp_pattern ()</a></td>
	<td class="summary">initialize Grid Pie Pattern
 (called when starting the application)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#check_recording_status">check_recording_status ()</a></td>
	<td class="summary">realtime recording, check if conditions have changed and call either
 start/stop_recording (will also update the pattern-sequence loop)
 this method is called by various notifiers</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#build_cache">build_cache ()</a></td>
	<td class="summary">build the initial pattern cache - called on application startup.</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#make_slot_unique">make_slot_unique (ptrack, track_idx)</a></td>
	<td class="summary">makes the target slot unique, update gridpie
 (first button that has been pressed is the target)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#get_idx_from_coords">get_idx_from_coords (x, y)</a></td>
	<td class="summary">translate X/Y into track/sequence position</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#get_ptrack_from_coords">get_ptrack_from_coords (x, y, skip_garbage)</a></td>
	<td class="summary">get a pattern-track (slot) from provided coordinates</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#get_ptrack">get_ptrack (seq_idx, track_idx)</a></td>
	<td class="summary">safely obtain a pattern-track by it's sequence/track index</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#adjust_grid">adjust_grid ()</a></td>
	<td class="summary">update the grid display
 (used sparingly, as this will paint each and every slot in the grid)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#paint_cell">paint_cell (cell, x, y)</a></td>
	<td class="summary">standalone method for painting individual cells in the grid
  used by adjust<em>grid and update</em>homeless_tracks</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#clear_track">clear_track (track_idx)</a></td>
	<td class="summary">clear a given track, and briefly mute it</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#brief_track_mute">brief_track_mute (track_idx)</a></td>
	<td class="summary">this is a hackaround, fix when API is updated
 See: http://www.renoise.com/board/index.php?showtopic=31927</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#copy_and_expand">copy_and_expand (patt_idx, dest_patt_idx, track_idx, num_lines, offset, lines_total, start_line, end_line)</a></td>
	<td class="summary">copy and expand a track</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#goto_slot">goto_slot (track_idx)</a></td>
	<td class="summary">show the first/master occurrence of the indicated GP slot, update display
 (nothing will happen if the slot isn't aliased)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#clone_pattern">clone_pattern ()</a></td>
	<td class="summary">Call this method to clone the GP pattern, insert at the end
 pattern<em>sequence</em>observable will take care of the rest...</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#toggler">toggler (x, y, pattern)</a></td>
	<td class="summary">toggle position in grid</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_toggle_slot">_toggle_slot (seq_idx, track_idx)</a></td>
	<td class="summary">toggle a particular slot, auto-detect if we should toggle on or off
 also, update the pattern-matrix mute state...</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_toggle_pattern">_toggle_pattern (seq_idx, track_idx)</a></td>
	<td class="summary">Toggle a particular pattern</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#has_aliased_master">has_aliased_master (ptrk, track_idx)</a></td>
	<td class="summary">determine if a (gridpie) slot has an aliased master</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#toggle_slot_record">toggle_slot_record (gridpie_patt, track_idx, mute, master_p_idx)</a></td>
	<td class="summary">method for toggling slots while realtime recording</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#set_record_patt_length">set_record_patt_length (gridpie_patt, num_lines, old_num_lines)</a></td>
	<td class="summary">when recording, we need to pay special attention to the pattern length</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#remove_buffer_pattern">remove_buffer_pattern ()</a></td>
	<td class="summary">remove buffer, turn back into gridpie pattern</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_update_pm_mutes">_update_pm_mutes (seq_idx, track_idx, muted)</a></td>
	<td class="summary">update PM mute state, called after toggling slot/pattern</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_build_app">_build_app ()</a></td>
	<td class="summary">inherited from Application</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#assign_to_slot">assign_to_slot (bt, force)</a></td>
	<td class="summary">unified method for multi-touch assign/unassign of slot aliases
 (is using the src_button variable to determine combinations)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#start_app">start_app (start_running)</a></td>
	<td class="summary">inherited from Application</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#stop_app">stop_app ()</a></td>
	<td class="summary">inherited from Application</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#abort">abort ()</a></td>
	<td class="summary">song has somehow become invalid - shut down active application</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_attach_line_notifiers">_attach_line_notifiers ()</a></td>
	<td class="summary">attach line notifier to selected pattern, including any aliased patterns</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_remove_line_notifiers">_remove_line_notifiers ()</a></td>
	<td class="summary">remove current set of line notifiers</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_restrict_to_pattern_length">_restrict_to_pattern_length (num_lines, patt)</a></td>
	<td class="summary">safe way to set pattern length</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_track_changes">_track_changes (pos)</a></td>
	<td class="summary">Decide if we need to update the recombination/source pattern
 note: this method might be called hundreds of times when doing edits like
 cutting all notes from a pattern, so we need it to be really simple</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#resolve_patt_idx">resolve_patt_idx (patt_idx, track_idx)</a></td>
	<td class="summary">resolve aliasing of a given pattern-track</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#on_new_document">on_new_document ()</a></td>
	<td class="summary">inherited from Application</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#update_homeless_tracks">update_homeless_tracks ()</a></td>
	<td class="summary">update display of homeless tracks</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#on_idle">on_idle ()</a></td>
	<td class="summary">inherited from Application</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#incremental_update">incremental_update (track_idx)</a></td>
	<td class="summary">Call this to produce output for one of the realtime tracks</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#get_gridpie_seq_pos">get_gridpie_seq_pos ()</a></td>
	<td class="summary">quick'n'dirty method for obtaining the gridpie sequence index
 (it will not check if the pattern is actually the right one)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#edit_pos_in_gridpie">edit_pos_in_gridpie ()</a></td>
	<td class="summary">determine if edit-position is inside the <strong>GRID PIE</strong> pattern</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#mute_selected_track_slot">mute_selected_track_slot (track_idx)</a></td>
	<td class="summary">mute existing selected slot (if any) in the pattern matrix</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#get_grid_x_pos">get_grid_x_pos (track_idx)</a></td>
	<td class="summary">determine the x-position of a track within the grid</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#get_grid_y_pos">get_grid_y_pos (patt_idx)</a></td>
	<td class="summary">determine the y-position of a pattern within the grid</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#playback_pos_to_gridpie">playback_pos_to_gridpie (restart)</a></td>
	<td class="summary">move playback position to the <strong>GRID PIE</strong> pattern</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#reset_tables">reset_tables ()</a></td>
	<td class="summary">prepare a bunch of values/tables</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_attach_to_song">_attach_to_song (new_song)</a></td>
	<td class="summary">attach notifiers to the song</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_attach_to_pattern">_attach_to_pattern (new_song)</a></td>
	<td class="summary">attach notifiers to the pattern</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#set_writeahead">set_writeahead ()</a></td>
	<td class="summary">To produce continous output to a pattern, we need to have an idea
 about how much the song-position is advancing within a period of time
 (the method is called when BPM/LPB is changed)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_keep_the_beat">_keep_the_beat (old_lines, old_pos)</a></td>
	<td class="summary">Keep the beat: perform a number of tricks in order to keep the playback
 inside the <strong>GRID PIE</strong> pattern steady, even as it's size is being changed
 note: to avoid glitches, call this method <em>before</em> doing anything heavy</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_remove_notifiers">_remove_notifiers (new_song, observables)</a></td>
	<td class="summary">detach all attached notifiers in list, but don't even try to detach
 when a new song arrived - old observables will no longer be alive then...</td>
	</tr>
</table>
<h2><a href="#Fields">Fields</a></h2>
<table class="function_list">
	<tr>
	<td class="name" nowrap><a href="#self.matrix_height">self.matrix_height</a></td>
	<td class="summary">width/height of the "grid" control-map group</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.matrix_cells">self.matrix_cells</a></td>
	<td class="summary">references to the grid's buttons</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.gridpie_patt_idx">self.gridpie_patt_idx</a></td>
	<td class="summary">pattern index of gridpie pattern</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.gp_buffer_seq_pos">self.gp_buffer_seq_pos</a></td>
	<td class="summary">sequence-pos/pattern-index of former gridpie pattern
 (assigned when session recording)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.skip_gp_notifier">self.skip_gp_notifier</a></td>
	<td class="summary">true when we shouldn't listen for changes to the
 gridpie pattern (when copying pattern data)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.last_playback_line">self.last_playback_line</a></td>
	<td class="summary">remember playback-pos line on each idle
 (for detecting when we arrive at the beginning of a pattern)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.realtime_record">self.realtime_record</a></td>
	<td class="summary">when we record changes in realtime (no aliasing)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.realtime_tracks">self.realtime_tracks</a></td>
	<td class="summary">list of tracks that should be output as
 incremental updates (during idle loop)
  track<em>idx (int)
  src</em>patt<em>idx (int)
  last</em>output_pos (int or nil)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.writeahead_length">self.writeahead_length</a></td>
	<td class="summary">(int) number of lines to output, each time an
 incremental update is written to the pattern</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.writeahead_interval">self.writeahead_interval</a></td>
	<td class="summary">(int) number of lines between incremental updates</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.skip_line_updates">self.skip_line_updates</a></td>
	<td class="summary">table of lines that should be skipped
 (for when we have written a note-off)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.poly_counter">self.poly_counter</a></td>
	<td class="summary">list of lengths (pattern-lines) for each track
 the value is nil when the track isn't active</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.revert_pm_slot">self.revert_pm_slot</a></td>
	<td class="summary">memorized state of the matrix</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.homeless_tracks">self.homeless_tracks</a></td>
	<td class="summary">indexed list of homeless tracks</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self._blink">self._blink</a></td>
	<td class="summary">the state of our slow blink rate
 (alternates between true and false)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.x_pos">self.x_pos</a></td>
	<td class="summary">these indicate the upper-left corner of the area
 currently displayed on the controller</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.active_slots">self.active_slots</a></td>
	<td class="summary">remember the slot sequence indices, set by toggler()
 (this is set, no matter if the track is active or not,
 check the poly_counter to see if the track is active)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self._track_count">self._track_count</a></td>
	<td class="summary">(int) remember the number of sequencer tracks, so we can
 tell when tracks have been removed or inserted
 before the tracks_observable is invoked</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.patt_cache">self.patt_cache</a></td>
	<td class="summary">
<p>the pattern cache: a table with this structure</p>
<pre><code>[patt_idx] = {
  [track_idx] = {
    cached_length (int)
  }
}
</code></pre>
</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.pending_updates">self.pending_updates</a></td>
	<td class="summary">
<p>when we have edited content that needs copy-expansion:</p>
<pre><code>[track_index] = {
  src_patt_idx (int)
  pos (line notifier table)
}
</code></pre>
</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self._update_task">self._update_task</a></td>
	<td class="summary">(Scheduler) delayed updates for copy-expanding</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.held_buttons">self.held_buttons</a></td>
	<td class="summary">
<p>keep track of held buttons in the matrix</p>
<pre><code>[x][y] = {
  obj (UIButton)
  ptrack (PatternTrack)
  track_idx (int)
  seq_idx (int)
  void (bool)
}
</code></pre>
</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.src_button">self.src_button</a></td>
	<td class="summary">the button which was first pressed</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self._is_monochrome">self._is_monochrome</a></td>
	<td class="summary">set once application has been initialized
 (if true then use alternative draw method)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.page_size_v">self.page_size_v</a></td>
	<td class="summary">page size (horizontal/vertical)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self._current_seq_index">self._current_seq_index</a></td>
	<td class="summary">remember the current pattern</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self._aligned_playpos">self._aligned_playpos</a></td>
	<td class="summary">pattern seq.</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self._playing_seq_idx">self._playing_seq_idx</a></td>
	<td class="summary">internal value for keeping track of playback
 progress through the pattern sequence...</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self._has_been_started">self._has_been_started</a></td>
	<td class="summary">(bool) true once application has been initialized</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.play_requested">self.play_requested</a></td>
	<td class="summary">various flags used by idle loop</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self._pattern_observables">self._pattern_observables</a></td>
	<td class="summary">song observables</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self._line_notifiers">self._line_notifiers</a></td>
	<td class="summary">pattern observables</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self._bt_prev_seq">self._bt_prev_seq</a></td>
	<td class="summary">UIComponent references</td>
	</tr>
</table>

<br/>
<br/>


    <h2><a name="Functions"></a>Functions</h2>
    <dl class="function">
    <dt>
    <a name = "__init"></a>
    <strong>__init (VarArg)</strong>
    </dt>
    <dd>
    Constructor method


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">VarArg</span>
        )
        </li>
    </ul>



    <h3>See also:</h3>
    <ul>
         <a href="../modules/Duplex.Application.html#">Duplex.Application</a>
    </ul>


</dd>
    <dt>
    <a name = "_add_pending_update"></a>
    <strong>_add_pending_update (src_patt_idx, pos)</strong>
    </dt>
    <dd>
    Method for adding pending updates, called whenever a pattern which is being
 monitored has changed and a track requires a copy-expansion.


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">src_patt_idx</span>
         (int) "unresolved" source pattern index
        </li>
        <li><span class="parameter">pos</span>
         (Table) pos.pattern, pos.track, pos.line
        </li>
    </ul>





</dd>
    <dt>
    <a name = "_apply_pending_updates"></a>
    <strong>_apply_pending_updates ()</strong>
    </dt>
    <dd>
    copy/expand tracks once the scheduled updates have timed out







</dd>
    <dt>
    <a name = "adapt_gridpie_pattern"></a>
    <strong>adapt_gridpie_pattern ()</strong>
    </dt>
    <dd>
    prepare a newly cloned Grid Pie pattern before playback reaches it







</dd>
    <dt>
    <a name = "is_session_recording"></a>
    <strong>is_session_recording ()</strong>
    </dt>
    <dd>
    helper method to determine if we are currently recording a session







</dd>
    <dt>
    <a name = "clear_lines"></a>
    <strong>clear_lines (track_idx, patt_idx, start_line, end_line)</strong>
    </dt>
    <dd>
    clear lines using iterator


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">track_idx</span>
         (int)
        </li>
        <li><span class="parameter">patt_idx</span>
         (int)
        </li>
        <li><span class="parameter">start_line</span>
         (int)
        </li>
        <li><span class="parameter">end_line</span>
         (int)
        </li>
    </ul>





</dd>
    <dt>
    <a name = "alias_slot"></a>
    <strong>alias_slot (track_idx, alias_p_idx)</strong>
    </dt>
    <dd>
    set one of the recombination pattern-tracks as aliased


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">track_idx</span>
         (int)
        </li>
        <li><span class="parameter">alias_p_idx</span>
         (int)
        </li>
    </ul>





</dd>
    <dt>
    <a name = "set_pattern_cache"></a>
    <strong>set_pattern_cache (patt_idx, track_idx, num_lines)</strong>
    </dt>
    <dd>
    update the internal pattern cache, called immediately after copy-expand


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">patt_idx</span>
         (int), the pattern index
        </li>
        <li><span class="parameter">track_idx</span>
         (int), the track index (0 to copy all tracks in pattern)
        </li>
        <li><span class="parameter">num_lines</span>
         (int), amount of lines or nil to clear
        </li>
    </ul>





</dd>
    <dt>
    <a name = "get_pattern_cache"></a>
    <strong>get_pattern_cache (patt_idx, track_idx)</strong>
    </dt>
    <dd>
    retrieve value from internal pattern cache


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">patt_idx</span>
         (int), the pattern index
        </li>
        <li><span class="parameter">track_idx</span>
         (int), the track index
        </li>
    </ul>

    <h3>Returns:</h3>
    <ol>

        (int or nil), amount of lines with valid data
    </ol>




</dd>
    <dt>
    <a name = "_set_page_sizes"></a>
    <strong>_set_page_sizes ()</strong>
    </dt>
    <dd>
    apply the current settings to page<em>size</em>v and page<em>size</em>h variables







</dd>
    <dt>
    <a name = "_get_v_limit"></a>
    <strong>_get_v_limit ()</strong>
    </dt>
    <dd>
    figure out the upper boundary



    <h3>Returns:</h3>
    <ol>

        int
    </ol>




</dd>
    <dt>
    <a name = "_get_h_limit"></a>
    <strong>_get_h_limit ()</strong>
    </dt>
    <dd>
    Figure out the lower boundary



    <h3>Returns:</h3>
    <ol>

        int
    </ol>




</dd>
    <dt>
    <a name = "set_vertical_pos"></a>
    <strong>set_vertical_pos (idx)</strong>
    </dt>
    <dd>
    set the vertical position of the grid


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">idx</span>
         (int)
        </li>
    </ul>





</dd>
    <dt>
    <a name = "set_horizontal_pos"></a>
    <strong>set_horizontal_pos (idx)</strong>
    </dt>
    <dd>
    set the horizontal position of the grid


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">idx</span>
         (int)
        </li>
    </ul>





</dd>
    <dt>
    <a name = "set_vertical_pos_page"></a>
    <strong>set_vertical_pos_page (seq_idx)</strong>
    </dt>
    <dd>
    set a pattern sequence index, quantized to page size


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">seq_idx</span>
         (int)
        </li>
    </ul>

    <h3>Returns:</h3>
    <ol>

        (int)
    </ol>




</dd>
    <dt>
    <a name = "update_h_buttons"></a>
    <strong>update_h_buttons ()</strong>
    </dt>
    <dd>
    update buttons for horizontal navigation







</dd>
    <dt>
    <a name = "update_v_buttons"></a>
    <strong>update_v_buttons ()</strong>
    </dt>
    <dd>
    update buttons for vertical navigation







</dd>
    <dt>
    <a name = "update_v_slider"></a>
    <strong>update_v_slider ()</strong>
    </dt>
    <dd>
    update slider for vertical navigation







</dd>
    <dt>
    <a name = "update_h_slider"></a>
    <strong>update_h_slider ()</strong>
    </dt>
    <dd>
    update slider for horizontal navigation







</dd>
    <dt>
    <a name = "goto_prev_track_page"></a>
    <strong>goto_prev_track_page ()</strong>
    </dt>
    <dd>
    go to previous track-page







</dd>
    <dt>
    <a name = "goto_next_track_page"></a>
    <strong>goto_next_track_page ()</strong>
    </dt>
    <dd>
    go to next track-page







</dd>
    <dt>
    <a name = "goto_first_track_page"></a>
    <strong>goto_first_track_page ()</strong>
    </dt>
    <dd>
    go to first track-page







</dd>
    <dt>
    <a name = "goto_last_track_page"></a>
    <strong>goto_last_track_page ()</strong>
    </dt>
    <dd>
    go to last track-page







</dd>
    <dt>
    <a name = "goto_next_seq_page"></a>
    <strong>goto_next_seq_page ()</strong>
    </dt>
    <dd>
    go to next sequence-page







</dd>
    <dt>
    <a name = "goto_prev_seq_page"></a>
    <strong>goto_prev_seq_page ()</strong>
    </dt>
    <dd>
    go to previous sequence-page







</dd>
    <dt>
    <a name = "goto_first_seq_page"></a>
    <strong>goto_first_seq_page ()</strong>
    </dt>
    <dd>
    go to first sequence-page







</dd>
    <dt>
    <a name = "goto_last_seq_page"></a>
    <strong>goto_last_seq_page ()</strong>
    </dt>
    <dd>
    go to last sequence-page







</dd>
    <dt>
    <a name = "can_mute_pattern"></a>
    <strong>can_mute_pattern (seq_idx)</strong>
    </dt>
    <dd>
    check if a hold event should perform a "pattern toggle"
 this is only possible when every track is active &amp; aligned


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">seq_idx</span>
         (int)
        </li>
    </ul>

    <h3>Returns:</h3>
    <ol>

        bool
    </ol>




</dd>
    <dt>
    <a name = "_slots_are_aligned"></a>
    <strong>_slots_are_aligned (seq_idx)</strong>
    </dt>
    <dd>
    function to check if all slots are aligned to the same sequence index


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">seq_idx</span>
         (int)
        </li>
    </ul>

    <h3>Returns:</h3>
    <ol>

        bool
    </ol>




</dd>
    <dt>
    <a name = "is_garbage_pos"></a>
    <strong>is_garbage_pos (track_idx, seq_idx)</strong>
    </dt>
    <dd>
    is garbage PM position?


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">track_idx</span>
         (int)
        </li>
        <li><span class="parameter">seq_idx</span>
         (int)
        </li>
    </ul>

    <h3>Returns:</h3>
    <ol>

        bool
    </ol>




</dd>
    <dt>
    <a name = "matrix_cell"></a>
    <strong>matrix_cell (x, y)</strong>
    </dt>
    <dd>
    access a cell in the Grid Pie


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">x</span>
         (int)
        </li>
        <li><span class="parameter">y</span>
         (int)
        </li>
    </ul>

    <h3>Returns:</h3>
    <ol>

        <a href="../modules/Duplex.UIButton.html#">Duplex.UIButton</a>
    </ol>




</dd>
    <dt>
    <a name = "init_pm_slots_to"></a>
    <strong>init_pm_slots_to (val)</strong>
    </dt>
    <dd>
    toggle all slot mutes in Pattern Matrix
 (called when starting and stopping the application)


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">val</span>
         (bool) true when starting, false when stopping (restore)
        </li>
    </ul>





</dd>
    <dt>
    <a name = "init_gp_pattern"></a>
    <strong>init_gp_pattern ()</strong>
    </dt>
    <dd>
    initialize Grid Pie Pattern
 (called when starting the application)







</dd>
    <dt>
    <a name = "check_recording_status"></a>
    <strong>check_recording_status ()</strong>
    </dt>
    <dd>
    realtime recording, check if conditions have changed and call either
 start/stop_recording (will also update the pattern-sequence loop)
 this method is called by various notifiers







</dd>
    <dt>
    <a name = "build_cache"></a>
    <strong>build_cache ()</strong>
    </dt>
    <dd>
    build the initial pattern cache - called on application startup.







</dd>
    <dt>
    <a name = "make_slot_unique"></a>
    <strong>make_slot_unique (ptrack, track_idx)</strong>
    </dt>
    <dd>
    makes the target slot unique, update gridpie
 (first button that has been pressed is the target)


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">ptrack</span>
         (PatternTrack) the target slot (destination)
        </li>
        <li><span class="parameter">track_idx</span>
         (int)
        </li>
    </ul>

    <h3>Returns:</h3>
    <ol>

        bool, true when slot was made unique
    </ol>




</dd>
    <dt>
    <a name = "get_idx_from_coords"></a>
    <strong>get_idx_from_coords (x, y)</strong>
    </dt>
    <dd>
    translate X/Y into track/sequence position


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">x</span>
         (int)
        </li>
        <li><span class="parameter">y</span>
         (int)
        </li>
    </ul>

    <h3>Returns:</h3>
    <ol>

        int,int
    </ol>




</dd>
    <dt>
    <a name = "get_ptrack_from_coords"></a>
    <strong>get_ptrack_from_coords (x, y, skip_garbage)</strong>
    </dt>
    <dd>
    get a pattern-track (slot) from provided coordinates


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">x</span>
         (int) grid x coordinate
        </li>
        <li><span class="parameter">y</span>
         (int) grid y coordinate
        </li>
        <li><span class="parameter">skip_garbage</span>
         (bool) skip garbage pos, including gridpie
        </li>
    </ul>

    <h3>Returns:</h3>
    <ol>

        renoise.PatternTrack or nil, int, int
    </ol>




</dd>
    <dt>
    <a name = "get_ptrack"></a>
    <strong>get_ptrack (seq_idx, track_idx)</strong>
    </dt>
    <dd>
    safely obtain a pattern-track by it's sequence/track index


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">seq_idx</span>
         (int)
        </li>
        <li><span class="parameter">track_idx</span>
         (int)
        </li>
    </ul>

    <h3>Returns:</h3>
    <ol>

        renoise.PatternTrack or nil
    </ol>




</dd>
    <dt>
    <a name = "adjust_grid"></a>
    <strong>adjust_grid ()</strong>
    </dt>
    <dd>
    update the grid display
 (used sparingly, as this will paint each and every slot in the grid)







</dd>
    <dt>
    <a name = "paint_cell"></a>
    <strong>paint_cell (cell, x, y)</strong>
    </dt>
    <dd>
    standalone method for painting individual cells in the grid
  used by adjust<em>grid and update</em>homeless_tracks


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">cell</span>
         (<a href="../modules/Duplex.UIButton.html#">Duplex.UIButton</a>)
        </li>
        <li><span class="parameter">x</span>
         (int)
        </li>
        <li><span class="parameter">y</span>
         (int)
        </li>
    </ul>





</dd>
    <dt>
    <a name = "clear_track"></a>
    <strong>clear_track (track_idx)</strong>
    </dt>
    <dd>
    clear a given track, and briefly mute it


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">track_idx</span>
         (int)
        </li>
    </ul>





</dd>
    <dt>
    <a name = "brief_track_mute"></a>
    <strong>brief_track_mute (track_idx)</strong>
    </dt>
    <dd>
    this is a hackaround, fix when API is updated
 See: http://www.renoise.com/board/index.php?showtopic=31927


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">track_idx</span>
         (int)
        </li>
    </ul>





</dd>
    <dt>
    <a name = "copy_and_expand"></a>
    <strong>copy_and_expand (patt_idx, dest_patt_idx, track_idx, num_lines, offset, lines_total, start_line, end_line)</strong>
    </dt>
    <dd>
    copy and expand a track


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">patt_idx</span>
         (Pattern) source pattern index
        </li>
        <li><span class="parameter">dest_patt_idx</span>
         (int) optional, destination pattern index - defined when realtime recording, will use the source pattern index if not defined
        </li>
        <li><span class="parameter">track_idx</span>
         (int) the track index
        </li>
        <li><span class="parameter">num_lines</span>
         (int) optional, lines to copy before repeating - use source pattern length if not defined
        </li>
        <li><span class="parameter">offset</span>
         (int) optional, the source line offset - 0 is the default
        </li>
        <li><span class="parameter">lines_total</span>
         (int) optional, use destination pattern length if not defined
        </li>
        <li><span class="parameter">start_line</span>
         (int) optional, start output from this line
        </li>
        <li><span class="parameter">end_line</span>
         (int) optional, stop output at this line
        </li>
    </ul>





</dd>
    <dt>
    <a name = "goto_slot"></a>
    <strong>goto_slot (track_idx)</strong>
    </dt>
    <dd>
    show the first/master occurrence of the indicated GP slot, update display
 (nothing will happen if the slot isn't aliased)


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">track_idx</span>
         (int)
        </li>
    </ul>





</dd>
    <dt>
    <a name = "clone_pattern"></a>
    <strong>clone_pattern ()</strong>
    </dt>
    <dd>
    Call this method to clone the GP pattern, insert at the end
 pattern<em>sequence</em>observable will take care of the rest...







</dd>
    <dt>
    <a name = "toggler"></a>
    <strong>toggler (x, y, pattern)</strong>
    </dt>
    <dd>
    toggle position in grid


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">x</span>
         (int)
        </li>
        <li><span class="parameter">y</span>
         (int)
        </li>
        <li><span class="parameter">pattern</span>
         (bool), whether to copy entire pattern
        </li>
    </ul>





</dd>
    <dt>
    <a name = "_toggle_slot"></a>
    <strong>_toggle_slot (seq_idx, track_idx)</strong>
    </dt>
    <dd>
    toggle a particular slot, auto-detect if we should toggle on or off
 also, update the pattern-matrix mute state...


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">seq_idx</span>
         (int), the pattern-sequence index
        </li>
        <li><span class="parameter">track_idx</span>
         (int), the track index
        </li>
    </ul>





</dd>
    <dt>
    <a name = "_toggle_pattern"></a>
    <strong>_toggle_pattern (seq_idx, track_idx)</strong>
    </dt>
    <dd>
    Toggle a particular pattern


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">seq_idx</span>
         (int)
        </li>
        <li><span class="parameter">track_idx</span>
         (int)
        </li>
    </ul>





</dd>
    <dt>
    <a name = "has_aliased_master"></a>
    <strong>has_aliased_master (ptrk, track_idx)</strong>
    </dt>
    <dd>
    determine if a (gridpie) slot has an aliased master


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">ptrk</span>
         (renoise.PatternTrack)
        </li>
        <li><span class="parameter">track_idx</span>
         (int)
        </li>
    </ul>

    <h3>Returns:</h3>
    <ol>

        (bool[,int]) - is<em>alias &amp; alias</em>pattern_index (optional)
    </ol>




</dd>
    <dt>
    <a name = "toggle_slot_record"></a>
    <strong>toggle_slot_record (gridpie_patt, track_idx, mute, master_p_idx)</strong>
    </dt>
    <dd>
    method for toggling slots while realtime recording


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">gridpie_patt</span>
         (renoise.Pattern) reference to gridpie pattern
        </li>
        <li><span class="parameter">track_idx</span>
         (int) the track index
        </li>
        <li><span class="parameter">mute</span>
         (bool) true when track should be muted
        </li>
        <li><span class="parameter">master_p_idx</span>
         (int) index of the originating/master pattern
        </li>
    </ul>





</dd>
    <dt>
    <a name = "set_record_patt_length"></a>
    <strong>set_record_patt_length (gridpie_patt, num_lines, old_num_lines)</strong>
    </dt>
    <dd>
    when recording, we need to pay special attention to the pattern length


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">gridpie_patt</span>
         (renoise.Pattern) reference to gridpie pattern
        </li>
        <li><span class="parameter">num_lines</span>
         (int)
        </li>
        <li><span class="parameter">old_num_lines</span>
         (int)
        </li>
    </ul>





</dd>
    <dt>
    <a name = "remove_buffer_pattern"></a>
    <strong>remove_buffer_pattern ()</strong>
    </dt>
    <dd>
    remove buffer, turn back into gridpie pattern







</dd>
    <dt>
    <a name = "_update_pm_mutes"></a>
    <strong>_update_pm_mutes (seq_idx, track_idx, muted)</strong>
    </dt>
    <dd>
    update PM mute state, called after toggling slot/pattern


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">seq_idx</span>
         (int)
        </li>
        <li><span class="parameter">track_idx</span>
         (int or nil), leave out to target the whole pattern
        </li>
        <li><span class="parameter">muted</span>
         (bool) true when we should mute the slot(s)
        </li>
    </ul>





</dd>
    <dt>
    <a name = "_build_app"></a>
    <strong>_build_app ()</strong>
    </dt>
    <dd>
    inherited from Application



    <h3>Returns:</h3>
    <ol>

        bool
    </ol>


    <h3>See also:</h3>
    <ul>
         <a href="../modules/Duplex.Application.html#_build_app">Duplex.Application._build_app</a>
    </ul>


</dd>
    <dt>
    <a name = "assign_to_slot"></a>
    <strong>assign_to_slot (bt, force)</strong>
    </dt>
    <dd>
    unified method for multi-touch assign/unassign of slot aliases
 (is using the src_button variable to determine combinations)


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">bt</span>
         (table) see GridPie.held_buttons
        </li>
        <li><span class="parameter">force</span>
         (bool) force-assign (otherwise, unique slots are left alone)
        </li>
    </ul>

    <h3>Returns:</h3>
    <ol>

        bool, true when assigned, false when we need to force-assign
    </ol>




</dd>
    <dt>
    <a name = "start_app"></a>
    <strong>start_app (start_running)</strong>
    </dt>
    <dd>
    inherited from Application


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">start_running</span>



        </li>
    </ul>

    <h3>Returns:</h3>
    <ol>

        bool or nil
    </ol>


    <h3>See also:</h3>
    <ul>
         <a href="../modules/Duplex.Application.html#start_app">Duplex.Application.start_app</a>
    </ul>


</dd>
    <dt>
    <a name = "stop_app"></a>
    <strong>stop_app ()</strong>
    </dt>
    <dd>
    inherited from Application





    <h3>See also:</h3>
    <ul>
         <a href="../modules/Duplex.Application.html#stop_app">Duplex.Application.stop_app</a>
    </ul>


</dd>
    <dt>
    <a name = "abort"></a>
    <strong>abort ()</strong>
    </dt>
    <dd>
    song has somehow become invalid - shut down active application







</dd>
    <dt>
    <a name = "_attach_line_notifiers"></a>
    <strong>_attach_line_notifiers ()</strong>
    </dt>
    <dd>
    attach line notifier to selected pattern, including any aliased patterns







</dd>
    <dt>
    <a name = "_remove_line_notifiers"></a>
    <strong>_remove_line_notifiers ()</strong>
    </dt>
    <dd>
    remove current set of line notifiers







</dd>
    <dt>
    <a name = "_restrict_to_pattern_length"></a>
    <strong>_restrict_to_pattern_length (num_lines, patt)</strong>
    </dt>
    <dd>
    safe way to set pattern length


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">num_lines</span>
         (int)
        </li>
        <li><span class="parameter">patt</span>
         (renoise.Pattern)
        </li>
    </ul>





</dd>
    <dt>
    <a name = "_track_changes"></a>
    <strong>_track_changes (pos)</strong>
    </dt>
    <dd>
    Decide if we need to update the recombination/source pattern
 note: this method might be called hundreds of times when doing edits like
 cutting all notes from a pattern, so we need it to be really simple


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">pos</span>
         (table with fields "pattern", "track" and "line")
        </li>
    </ul>





</dd>
    <dt>
    <a name = "resolve_patt_idx"></a>
    <strong>resolve_patt_idx (patt_idx, track_idx)</strong>
    </dt>
    <dd>
    resolve aliasing of a given pattern-track


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">patt_idx</span>
            <span class="types"><span class="type">TRACE("GridPie</span></span>



        </li>
        <li><span class="parameter">track_idx</span>
        resolve<em>patt</em>idx()",patt<em>idx,track</em>idx)
        </li>
    </ul>

    <h3>Returns:</h3>
    <ol>

        int, the resolived pattern index
    </ol>




</dd>
    <dt>
    <a name = "on_new_document"></a>
    <strong>on_new_document ()</strong>
    </dt>
    <dd>
    inherited from Application





    <h3>See also:</h3>
    <ul>
         <a href="../modules/Duplex.Application.html#on_new_document">Duplex.Application.on_new_document</a>
    </ul>


</dd>
    <dt>
    <a name = "update_homeless_tracks"></a>
    <strong>update_homeless_tracks ()</strong>
    </dt>
    <dd>
    update display of homeless tracks







</dd>
    <dt>
    <a name = "on_idle"></a>
    <strong>on_idle ()</strong>
    </dt>
    <dd>
    inherited from Application





    <h3>See also:</h3>
    <ul>
         <a href="../modules/Duplex.Application.html#on_idle">Duplex.Application.on_idle</a>
    </ul>


</dd>
    <dt>
    <a name = "incremental_update"></a>
    <strong>incremental_update (track_idx)</strong>
    </dt>
    <dd>
    Call this to produce output for one of the realtime tracks


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">track_idx</span>
         (int)
        </li>
    </ul>





</dd>
    <dt>
    <a name = "get_gridpie_seq_pos"></a>
    <strong>get_gridpie_seq_pos ()</strong>
    </dt>
    <dd>
    quick'n'dirty method for obtaining the gridpie sequence index
 (it will not check if the pattern is actually the right one)







</dd>
    <dt>
    <a name = "edit_pos_in_gridpie"></a>
    <strong>edit_pos_in_gridpie ()</strong>
    </dt>
    <dd>
    determine if edit-position is inside the <strong>GRID PIE</strong> pattern



    <h3>Returns:</h3>
    <ol>

        bool
    </ol>




</dd>
    <dt>
    <a name = "mute_selected_track_slot"></a>
    <strong>mute_selected_track_slot (track_idx)</strong>
    </dt>
    <dd>
    mute existing selected slot (if any) in the pattern matrix


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">track_idx</span>
         (int)
        </li>
    </ul>





</dd>
    <dt>
    <a name = "get_grid_x_pos"></a>
    <strong>get_grid_x_pos (track_idx)</strong>
    </dt>
    <dd>
    determine the x-position of a track within the grid


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">track_idx</span>
         (int)
        </li>
    </ul>





</dd>
    <dt>
    <a name = "get_grid_y_pos"></a>
    <strong>get_grid_y_pos (patt_idx)</strong>
    </dt>
    <dd>
    determine the y-position of a pattern within the grid


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">patt_idx</span>
         (int)
        </li>
    </ul>





</dd>
    <dt>
    <a name = "playback_pos_to_gridpie"></a>
    <strong>playback_pos_to_gridpie (restart)</strong>
    </dt>
    <dd>
    move playback position to the <strong>GRID PIE</strong> pattern


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">restart</span>
         (bool) force pattern to play from the beginning
        </li>
    </ul>





</dd>
    <dt>
    <a name = "reset_tables"></a>
    <strong>reset_tables ()</strong>
    </dt>
    <dd>
    prepare a bunch of values/tables







</dd>
    <dt>
    <a name = "_attach_to_song"></a>
    <strong>_attach_to_song (new_song)</strong>
    </dt>
    <dd>
    attach notifiers to the song


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">new_song</span>
         (bool) when false, we attempt to remove existing notifiers
        </li>
    </ul>





</dd>
    <dt>
    <a name = "_attach_to_pattern"></a>
    <strong>_attach_to_pattern (new_song)</strong>
    </dt>
    <dd>
    attach notifiers to the pattern


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">new_song</span>
         (bool) when false, we attempt to remove existing notifiers
        </li>
    </ul>





</dd>
    <dt>
    <a name = "set_writeahead"></a>
    <strong>set_writeahead ()</strong>
    </dt>
    <dd>
    To produce continous output to a pattern, we need to have an idea
 about how much the song-position is advancing within a period of time
 (the method is called when BPM/LPB is changed)







</dd>
    <dt>
    <a name = "_keep_the_beat"></a>
    <strong>_keep_the_beat (old_lines, old_pos)</strong>
    </dt>
    <dd>
    Keep the beat: perform a number of tricks in order to keep the playback
 inside the <strong>GRID PIE</strong> pattern steady, even as it's size is being changed
 note: to avoid glitches, call this method <em>before</em> doing anything heavy


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">old_lines</span>
         (int) the previous number of lines
        </li>
        <li><span class="parameter">old_pos</span>
         (renoise.SongPos) the songposition to translate
        </li>
    </ul>





</dd>
    <dt>
    <a name = "_remove_notifiers"></a>
    <strong>_remove_notifiers (new_song, observables)</strong>
    </dt>
    <dd>
    detach all attached notifiers in list, but don't even try to detach
 when a new song arrived - old observables will no longer be alive then...


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">new_song</span>
         (bool), true to leave existing notifiers alone
        </li>
        <li><span class="parameter">observables</span>
         (table)
        </li>
    </ul>





</dd>
</dl>
    <h2><a name="Fields"></a>Fields</h2>
    <dl class="function">
    <dt>
    <a name = "self.matrix_height"></a>
    <strong>self.matrix_height</strong>
    </dt>
    <dd>
    width/height of the "grid" control-map group







</dd>
    <dt>
    <a name = "self.matrix_cells"></a>
    <strong>self.matrix_cells</strong>
    </dt>
    <dd>
    references to the grid's buttons







</dd>
    <dt>
    <a name = "self.gridpie_patt_idx"></a>
    <strong>self.gridpie_patt_idx</strong>
    </dt>
    <dd>
    pattern index of gridpie pattern







</dd>
    <dt>
    <a name = "self.gp_buffer_seq_pos"></a>
    <strong>self.gp_buffer_seq_pos</strong>
    </dt>
    <dd>
    sequence-pos/pattern-index of former gridpie pattern
 (assigned when session recording)







</dd>
    <dt>
    <a name = "self.skip_gp_notifier"></a>
    <strong>self.skip_gp_notifier</strong>
    </dt>
    <dd>
    true when we shouldn't listen for changes to the
 gridpie pattern (when copying pattern data)







</dd>
    <dt>
    <a name = "self.last_playback_line"></a>
    <strong>self.last_playback_line</strong>
    </dt>
    <dd>
    remember playback-pos line on each idle
 (for detecting when we arrive at the beginning of a pattern)







</dd>
    <dt>
    <a name = "self.realtime_record"></a>
    <strong>self.realtime_record</strong>
    </dt>
    <dd>
    when we record changes in realtime (no aliasing)







</dd>
    <dt>
    <a name = "self.realtime_tracks"></a>
    <strong>self.realtime_tracks</strong>
    </dt>
    <dd>
    list of tracks that should be output as
 incremental updates (during idle loop)
  track<em>idx (int)
  src</em>patt<em>idx (int)
  last</em>output_pos (int or nil)







</dd>
    <dt>
    <a name = "self.writeahead_length"></a>
    <strong>self.writeahead_length</strong>
    </dt>
    <dd>
    (int) number of lines to output, each time an
 incremental update is written to the pattern







</dd>
    <dt>
    <a name = "self.writeahead_interval"></a>
    <strong>self.writeahead_interval</strong>
    </dt>
    <dd>
    (int) number of lines between incremental updates







</dd>
    <dt>
    <a name = "self.skip_line_updates"></a>
    <strong>self.skip_line_updates</strong>
    </dt>
    <dd>
    table of lines that should be skipped
 (for when we have written a note-off)







</dd>
    <dt>
    <a name = "self.poly_counter"></a>
    <strong>self.poly_counter</strong>
    </dt>
    <dd>
    list of lengths (pattern-lines) for each track
 the value is nil when the track isn't active







</dd>
    <dt>
    <a name = "self.revert_pm_slot"></a>
    <strong>self.revert_pm_slot</strong>
    </dt>
    <dd>
    memorized state of the matrix







</dd>
    <dt>
    <a name = "self.homeless_tracks"></a>
    <strong>self.homeless_tracks</strong>
    </dt>
    <dd>
    indexed list of homeless tracks







</dd>
    <dt>
    <a name = "self._blink"></a>
    <strong>self._blink</strong>
    </dt>
    <dd>
    the state of our slow blink rate
 (alternates between true and false)







</dd>
    <dt>
    <a name = "self.x_pos"></a>
    <strong>self.x_pos</strong>
    </dt>
    <dd>
    these indicate the upper-left corner of the area
 currently displayed on the controller







</dd>
    <dt>
    <a name = "self.active_slots"></a>
    <strong>self.active_slots</strong>
    </dt>
    <dd>
    remember the slot sequence indices, set by toggler()
 (this is set, no matter if the track is active or not,
 check the poly_counter to see if the track is active)







</dd>
    <dt>
    <a name = "self._track_count"></a>
    <strong>self._track_count</strong>
    </dt>
    <dd>
    (int) remember the number of sequencer tracks, so we can
 tell when tracks have been removed or inserted
 before the tracks_observable is invoked







</dd>
    <dt>
    <a name = "self.patt_cache"></a>
    <strong>self.patt_cache</strong>
    </dt>
    <dd>

<p>the pattern cache: a table with this structure</p>
<pre><code>[patt_idx] = {
  [track_idx] = {
    cached_length (int)
  }
}
</code></pre>








</dd>
    <dt>
    <a name = "self.pending_updates"></a>
    <strong>self.pending_updates</strong>
    </dt>
    <dd>

<p>when we have edited content that needs copy-expansion:</p>
<pre><code>[track_index] = {
  src_patt_idx (int)
  pos (line notifier table)
}
</code></pre>








</dd>
    <dt>
    <a name = "self._update_task"></a>
    <strong>self._update_task</strong>
    </dt>
    <dd>
    (Scheduler) delayed updates for copy-expanding







</dd>
    <dt>
    <a name = "self.held_buttons"></a>
    <strong>self.held_buttons</strong>
    </dt>
    <dd>

<p>keep track of held buttons in the matrix</p>
<pre><code>[x][y] = {
  obj (UIButton)
  ptrack (PatternTrack)
  track_idx (int)
  seq_idx (int)
  void (bool)
}
</code></pre>








</dd>
    <dt>
    <a name = "self.src_button"></a>
    <strong>self.src_button</strong>
    </dt>
    <dd>
    the button which was first pressed







</dd>
    <dt>
    <a name = "self._is_monochrome"></a>
    <strong>self._is_monochrome</strong>
    </dt>
    <dd>
    set once application has been initialized
 (if true then use alternative draw method)







</dd>
    <dt>
    <a name = "self.page_size_v"></a>
    <strong>self.page_size_v</strong>
    </dt>
    <dd>
    page size (horizontal/vertical)







</dd>
    <dt>
    <a name = "self._current_seq_index"></a>
    <strong>self._current_seq_index</strong>
    </dt>
    <dd>
    remember the current pattern







</dd>
    <dt>
    <a name = "self._aligned_playpos"></a>
    <strong>self._aligned_playpos</strong>
    </dt>
    <dd>
    pattern seq.  index from when we started, and the
 "aligned" song position (nil when all active tracks
 aren't aligned to the same sequence pos)







</dd>
    <dt>
    <a name = "self._playing_seq_idx"></a>
    <strong>self._playing_seq_idx</strong>
    </dt>
    <dd>
    internal value for keeping track of playback
 progress through the pattern sequence...







</dd>
    <dt>
    <a name = "self._has_been_started"></a>
    <strong>self._has_been_started</strong>
    </dt>
    <dd>
    (bool) true once application has been initialized







</dd>
    <dt>
    <a name = "self.play_requested"></a>
    <strong>self.play_requested</strong>
    </dt>
    <dd>
    various flags used by idle loop







</dd>
    <dt>
    <a name = "self._pattern_observables"></a>
    <strong>self._pattern_observables</strong>
    </dt>
    <dd>
    song observables







</dd>
    <dt>
    <a name = "self._line_notifiers"></a>
    <strong>self._line_notifiers</strong>
    </dt>
    <dd>
    pattern observables







</dd>
    <dt>
    <a name = "self._bt_prev_seq"></a>
    <strong>self._bt_prev_seq</strong>
    </dt>
    <dd>
    UIComponent references







</dd>
</dl>


</div> <!-- id="content" -->
</div> <!-- id="main" -->
<div id="about">
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i>
</div> <!-- id="about" -->
</div> <!-- id="container" -->
</body>
</html>
